/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analiseSintatica.Regras.Expressoes;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.ErroSemantico;
import analiseSemantica.Tipos.TipoSemantico;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSemantica.estruturadedados.Identificador;
import analiseSintatica.AnalisadorSintatico;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import java.util.LinkedList;

/**
 *
 * @author linton
 * @author nathy
 */
public class RegraIncremento extends Regra {

    protected static Regra instancia;
//<incremento> ::= identificador <op_incremento>
    protected String estrutura = "identificador <op_incremento>";

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraIncremento() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraIncremento getInstance() {
        if (instancia == null) {
            instancia = new RegraIncremento();
        }
        return (RegraIncremento) instancia;
    }


    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
       
    	LinkToken id;
        TiposSemanticos tipos = new TiposSemanticos();
        id = reconheceRetornaToken(listaTokens,"identificador",estrutura);
        RegraOpIncremento.getInstance().analisar(listaTokens);


        //ANALISE SEMANTICA
        if(AnalisadorSintatico.escopoatual.find(id.getLexema())==null){
        	AnalisadorSintatico.errosemanticos.add(new ErroSemantico(id.getLexema()+" nao reconhecido", id.getLinha()));
            return null;
        }
        else{
            Identificador idToken = (Identificador) AnalisadorSintatico.escopoatual.find(id.getLexema());
            String tipoId = idToken.getTipo();
            //Quando eh ponteiro pode fazer incremento
            if(tipoId.equals("int")||idToken.isPonteiro()){
                tipos.addTipos(new TipoSemantico(tipoId,id.getLinha()));
            }
            else {
            	AnalisadorSintatico.errosemanticos.add(new ErroSemantico("Operacao nao permitida para tipo"+tipoId, id.getLinha()));
                return null;
            }
         }
        return tipos;
    }

    public LinkToken reconhecerIdentificador(LinkedList<LinkToken> listaTokens){
        
        return listaTokens.removeFirst();
    }    

    @Override
    protected void setPrimeiro() {
        this.primeiro.add("identificador");
    }

}
